package com.swbyte.utils.system

import android.accessibilityservice.AccessibilityService
import android.accessibilityservice.AccessibilityServiceInfo
import android.content.Context
import android.content.Intent
import android.provider.Settings
import android.text.TextUtils
import android.util.Log
import android.view.accessibility.AccessibilityEvent
import android.view.accessibility.AccessibilityManager
import android.view.accessibility.AccessibilityNodeInfo
import com.chaodriod.common.utils.ALog
import com.chaodriod.common.utils.Utils


/**
 * Created by 72byte on 2018/1/27.
 */
class AutoInstallService : AccessibilityService() {

    //打开一定要在确定的前面，否则安装完就悲剧了
    private val clicktexts = arrayOf("允许", "总是允许", "安装", "继续", "继续安装", "替换", "下一步", "仅允许一次", "激活", "打开", "确定")

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        ALog.e( "")
        return super.onStartCommand(intent, flags, startId)
    }


    override fun onDestroy() {
        super.onDestroy()
        ALog.e( "")
    }

    /**
     * 这里我们通过递归的方式将安装界面中所有的子节点全部进行遍历，当发现按钮节点的时候就进行判断，
     * 按钮上的文字是不是“安装”、“完成”、“确定”等几种类型，如果是的话就模拟一下点击事件，
     * 这样也就相当于帮用户自动操作了这些按钮。
     * 另外从Android 4.4系统开始，用户需要将应用申请的所有权限看完才可以点击安装，
     * 因此如果我们在节点中发现了ScrollView，那就模拟一下滑动事件，
     * 将界面滑动到最底部，这样安装按钮就可以点击了。
     *
     * @param nodeInfo
     * @return
     */
    override fun onAccessibilityEvent(event: AccessibilityEvent) {
        // 在某些rom上，event.getSource()获取到的某些值为null
        // AccessibilityNodeInfo nodeInfo = event.getSource();
//        Log.e("chen", ""+event)
        val nodeInfo = rootInActiveWindow
        if (nodeInfo != null) {
            val eventType = event.eventType
            ALog.e(  String.format("eventType: %#x", eventType))
            if (eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED || eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
                for (clickText in clicktexts) {
                    iterateNodesAndHandle(clickText, nodeInfo)
                }
            }
        }
    }


    /**
     *
     * 检查是否是卸载操作（如果安装界面出现“卸载”，那就无计咯）
     * @param nodeInfo
     * @return
     */

    private fun checkIfUnInstall(nodeInfo: AccessibilityNodeInfo): Boolean {
        val infos = nodeInfo.findAccessibilityNodeInfosByText("卸载")
        return infos != null && !infos.isEmpty()
    }

    /**
     * 这里我们通过递归的方式将安装界面中所有的子节点全部进行遍历，当发现按钮节点的时候就进行判断，
     * 按钮上的文字是不是“安装”、“完成”、“确定”等几种类型，如果是的话就模拟一下点击事件，
     * 这样也就相当于帮用户自动操作了这些按钮。
     * 另外从Android 4.4系统开始，用户需要将应用申请的所有权限看完才可以点击安装，
     * 因此如果我们在节点中发现了ScrollView，那就模拟一下滑动事件，
     * 将界面滑动到最底部，这样安装按钮就可以点击了。
     *
     * @param nodeInfo
     * @return
     */

    private fun iterateNodesAndHandle(clickText: String, nodeInfo: AccessibilityNodeInfo?): Boolean {
        if (nodeInfo != null) {
            if ("管理设备管理器" == nodeInfo.text ) {
                return true
            }
            val childCount = nodeInfo.childCount
            if ("android.widget.ScrollView" == nodeInfo.className) {
                nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)
            }
            if (clickText == nodeInfo.text && nodeInfo.isClickable && nodeInfo.isEnabled) {
                ALog.e( "content is " + clickText)
                nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK)
                return true
            }
            for (i in 0 until childCount) {
                val childNodeInfo = nodeInfo.getChild(i)
                if (iterateNodesAndHandle(clickText, childNodeInfo)) {
                    return true
                }
            }
        }
        return false
    }


    override fun onServiceConnected() {
        Log.e(TAG, "无障碍服务已开启")
    }


    override fun onUnbind(intent: Intent): Boolean {
        Log.e(TAG, "无障碍服务已关闭")
        return super.onUnbind(intent)

    }


    override fun onInterrupt() {

    }

    companion object {
        private val TAG = AutoInstallService::class.java.simpleName

        //检查服务是否开启
        fun isServiceEnabled(): Boolean {
            var accessibilityManager = Utils.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
            var accessibilityServices = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK) as List<AccessibilityServiceInfo>
            for (info in accessibilityServices) {
                if (info.id.contains("com.swbyte.app/com.swbyte.utils.system.AutoInstallService") ||
                        info.id.contains("com.swbyte.app/.service.AutoInstallService")) {
                    return true
                }
            }
            var ok = 0
            try {
                ok = Settings.Secure.getInt( Utils.getContext().contentResolver, Settings.Secure.ACCESSIBILITY_ENABLED)
            } catch (e: Settings.SettingNotFoundException) {
            }
            val ms = TextUtils.SimpleStringSplitter(':')
            if (ok == 1) {
                val settingValue = Settings.Secure.getString( Utils.getContext().contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES)
                if (settingValue != null) {
                    ms.setString(settingValue)
                    while (ms.hasNext()) {
                        val accessibilityService = ms.next()
                        if (accessibilityService.equals("com.swbyte.app/com.swbyte.utils.system.AutoInstallService", ignoreCase = true) ||
                                accessibilityService.equals("com.swbyte.app/.service.AutoInstallService", ignoreCase = true)) {
                            return true
                        }

                    }
                }
            }
            return false
        }
    }

}